#!/bin/bash

# 为分离git目录为子模块做准备

function usage () {
    echo "Usage: $( basename $0 ) [-d <sub_dir>]"
    echo "     为分离git目录为子模块做准备"
    echo "     -d <sub_dir>: 将要转换为子模块的目录"
    exit 1
}

while getopts ":d:" arg
do
    case "${arg}" in 
        d)
            subDir="${OPTARG}"
            ;;
        *)
            usage
            ;;
    esac
done

if [ -z "${subDir}" ]
then
    usage
fi

if [ ! -d "${subDir}" ]
then
    echo "ERROR: 目录${subDir}不存在"
    exit 1
fi

FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter "${subDir}" -- --all
# --tag-name-filter cat 该参数控制我们要如何保存旧的tag，参数值为bash命令，cat表示原样输出。所以，如果你不关心tag，就不需要这个参数了；
# --prune-empty 删除空的（对子目录没有影响的）的提交
# --subdirectory-filter coloshine 指定子模块路径
# -- --all 该参数必须跟在--后面，表示对所有分支做操作，即对上一步创建的所有本地分支做操作。所以，如果你只想保存当前分支，就不需要这个参数了

# 当前的仓库中还保存这一下不需要的object，清理这些能减小当前仓库的体积
echo "----------------------------------"
echo "清理object之前磁盘占用量" $( du -sh . )
echo "----------------------------------"
git reset --hard
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --aggressive --prune=now
echo "----------------------------------"
echo "清理object之后磁盘占用量" $( du -sh . )
echo "----------------------------------"

echo "Done"
